package org.tissou.server.Operations;

import org.tissou.client.Services.Compte;
import org.tissou.client.Services.CategorieInfos;
import org.tissou.client.Services.MonException;
import org.tissou.client.Services.Parametres;
import org.tissou.server.Base.Monnaie;

import java.util.Date;
import java.util.List;
import java.util.ArrayList;

/**
 * Created by IntelliJ IDEA.
 * User: Claire
 * Date: 18-Jan-2009
 * Time: 22:35:09
 * To change this template use File | Settings | File Templates.
 */
abstract class Operation_Dette extends Operation_Base {
  Compte Compte_Donneur;
  Compte Compte_Receveur;
  Float Somme;
  boolean Verifie;

  CategorieInfos Categorie;
  String Libelle_Donneur;
  String Libelle_Receveur;
  Monnaie monnaie;

  public Operation_Dette (Date date, Compte compte_donneur, Compte compte_receveur,
                                  Float somme, boolean verifie){
    Date = date;
    Compte_Donneur = compte_donneur;
    Compte_Receveur = compte_receveur;
    Somme = somme;
    Verifie = verifie;
    this.monnaie = new Monnaie(Compte_Donneur.getMonnaie());

  }

  public Operation_Dette (Date date, Compte compte_donneur, Compte compte_receveur,
                                  Float somme, boolean verifie, CategorieInfos categorie){
    Date = date;
    Compte_Donneur = compte_donneur;
    Compte_Receveur = compte_receveur;
    Somme = somme;
    Verifie = verifie;
    this.monnaie = new Monnaie(Compte_Donneur.getMonnaie());
    Categorie = categorie;

  }



  public boolean Parametres_Compatibles(){
    if(Compte.ProprietairesIdentiques(Compte_Receveur, Compte_Donneur)){
      System.out.println(Compte_Donneur.getNoCompte());
      System.out.println(Compte_Receveur.getNoCompte());
      throw new MonException("Impossible: il faut que les proprietaires soient differents pour que ca marche.");
    }
    if(!Compte.MonnaiesIdentiques(Compte_Receveur, Compte_Donneur)){
      throw new MonException("Impossible: les deux comptes selectionnes doivent avoir la meme monnaie.");
    }
    if (Somme <= 0){
      throw new MonException("La somme entree est strictement negative");
    }
    if(Compte_Receveur.estCeQueTesVirtuelMec()){
      throw new MonException("Le compte qui recoit l'argent est un compte virtuel, ca ne va pas.");
    }
    if(Compte_Donneur.estCeQueTesVirtuelMec()){
      throw new MonException("Le compte qui donne l'argent est un compte virtuel, ca ne va pas.");
    }
    return true;
  }

  protected static boolean ConstruireAvecParametres_Compatibilite(Parametres parametres) {
    boolean resultat = true;

    if(!(parametres.NombreComptes() == 2)){
      throw new MonException("Au moins un compte n'a pas ete selectionne proprement.");
    }
   if(!(parametres.NombreSommes() == 1)){
     throw new MonException("Il n'y a pas de somme rentree !");
   }

    resultat &= (parametres.NombreCategories()==0)||(parametres.NombreCategories()==1);
    resultat &= (parametres.NombreProprietaires() == 0);
    resultat &= (parametres.NombreLibelles() == 0);
    resultat &= (parametres.NombreMonnaies() == 0);
    resultat &= (parametres.NombreDettes() == 0);

    return resultat;
  }

  public List<Transaction> Retourne_Transactions() {

    List<Transaction> AAjouter = new ArrayList<Transaction>();
    AAjouter.add(new Transaction(Date, Compte_Donneur, Categorie, Libelle_Donneur, -Somme,
        Verifie, null));
    AAjouter.add(new Transaction(Date, Compte_Receveur, Categorie, Libelle_Receveur, Somme,
        Verifie, null));
    AAjouter.add(new Transaction(Date, Compte_Donneur.getProprio().RenvoyerCompteVirtuel(monnaie.getInfos()), Categorie,
        Libelle_Donneur, Somme, Verifie, Compte_Receveur.getProprio()));
    AAjouter.add(new Transaction(Date, Compte_Receveur.getProprio().RenvoyerCompteVirtuel(monnaie.getInfos()), Categorie,
        Libelle_Receveur, -Somme, Verifie, Compte_Donneur.getProprio()));
    return AAjouter;
  }
}
